package com.atguigu.spzx.manager.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.spzx.manager.mapper.product.CategoryMapper;
import com.atguigu.spzx.model.excel.product.CategoryExcelData;
import jakarta.annotation.Resource;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
//import org.springframework.stereotype.Component;

//@Component
public class CategoryExcelDataListener extends AnalysisEventListener<CategoryExcelData> {
//    @Resource
    CategoryMapper categoryMapper;
    public CategoryExcelDataListener(CategoryMapper categoryMapper){
        this.categoryMapper = categoryMapper;
    }
    private int limit = 100;//每100行批量保存一次的阈值
    private List<CategoryExcelData> list = new ArrayList<>();//缓存数据的集合
    private int batchSaveCount = 0;
    /*
            更新：
                唯一字段校验
            新增：
                重复校验
     */
    //每读取一行回调一次
    @Override
    public void invoke(CategoryExcelData data, AnalysisContext context) {
        /*
            如果有一条记录逻辑删除了：数据库仍然存在
                我们判断数据是否存在时，只考虑了未删除的数据，会导致新增的数据 如果和已删除数据重复 仍然会写入

                处理方式：
                    1、如果不考虑已删除的数据是否重复，数据库不能使用唯一约束
                    2、如果考虑已删除的数据是否重复
                        判断是否重复时 需要考虑所有数据

         */
        //如果已存在的数据不需要添加到list集合中：判断数据是否已存在
        //如果导入的数据 id已存在 或者  (name+parent_id)已存在 我们认为数据重复
        boolean exist = categoryMapper.exist(data);
        if(exist){
            //已存在，结束本次调用
            return;
        }

        list.add(data);
        if(list.size()>=limit){
            //批量保存
            categoryMapper.batchSave(list);
            //清空list集合的缓存
            list.clear();
            System.out.println("本次文件解析批量保存第"+(++batchSaveCount)+"次");
        }

    }
    //excel解析完毕回调一次
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if(!CollectionUtils.isEmpty(list)){
            //保存list中残留的数据
            categoryMapper.batchSave(list);
            //清空list集合的缓存
            list.clear();
            System.out.println("本次文件解析批量保存第"+(++batchSaveCount)+"次");
        }
        batchSaveCount = 0;

    }
}
